A compiler traditionally compiles a programming language and transforms it into an executable code. The compiler performs syntactic, semantic analysis and code generation on the programming language. The compiler can be implemented in the front end of a computer system or on the back end of a computer system as well, and forms a complex system to check the grammar definition of the programming language.
A web server typically uses hundreds of threads to process a large number of concurrent users. A thread can be processed with other threads at the same time. In order to ensure compatibility when multiple threads are trying to use shared resources, one thread is allowed to access the shared resources at a time by using thread synchronization. Thread synchronization on Java can be performed by using a monitor where every Java object has a single monitor and a monitor can be owned by only one thread. For a thread to own a monitor that is owned by a different thread, it needs to wait in the wait queue until the other thread releases its monitor.
Thus, deadlock may occur when two or more threads are waiting for other threads to complete their tasks in order to complete their own tasks. When deadlocks and memory leaks occur, there may be some useful information from performing a thread. For example, a thread dump generates information on the status of each thread such as whether a thread is new, blocked, waiting, or terminated. From this information, a list of concurrently running processes along with their corresponding status (e.g., running, sleeping, waiting) at the time of measurement can be generated in a visual graphical user interface. However, what is not visible is the time sequence of the execution of the threads that are deadlocked because the current thread dump only identifies a thread status at a time of measurement.